#include "Sort.h"

using namespace JorenAlgorithm;

Sort::Sort(JorenAlgorithm::Sort::SORTMETHOD method, int *source, int len)
{
	this->method=method;
	this->source=source;
	this->len=len;
}

Sort::~Sort()
{
}

JorenAlgorithm::Sort::SORTMETHOD Sort::getMethod()
{
	return this->method;
}

void Sort::setMethod(JorenAlgorithm::Sort::SORTMETHOD method)
{
	this->method=method;
}

int* Sort::getSource()
{
	return this->source;
}

void Sort::setSource(int *source)
{
	this->source=source;
}

int Sort::getLen()
{
	return this->len;
}

void Sort::setLen(int len)
{
	this->len=len;
}

void Sort::print()
{
	int i;
	for(i=0;i<len;i++)
		cout<<"source["<<i<<"]="<<source[i]<<"\t";
	cout<<endl;
}

int Sort::run()
{
	return sort();
}

int Sort::sort()
{
	switch(method)
	{
	case INSERTSORT:
		return insertSort();
	case Sort::MERGING:
		mergeSort(0,len-1);
		return 1;
	default:
		return 0;
	}
}

int Sort::insertSort()
{
	int temp=0;
	int i=0;
	for(i=1;i<len;i++)
	{
		int j=i-1;
		temp=source[i];
		for(;j>=0&&temp<source[j];j--)
			source[j+1]=source[j];
		source[j+1]=temp;
	}

	return 1;
}

void Sort::mergeSort(int s, int t)
{
	if(s==t);
	else
	{
		int m=(s+t)/2;
		mergeSort(s,m);
		mergeSort(m+1,t);
		merge(s,m,t);
	}
}

void Sort::swap(int a, int b)
{
	a=a+b;
	b=a-b;
	a=a-b;
}

void Sort::merge(int s, int m, int t)
{
	const int length=t-s+1;
	int *temp=new int[length];
	int i=s,j=m+1,k=0;
	for(;i<=m,j<=t;k++)
	{
		if(source[i]>source[j]) temp[k]=source[j++];
		else temp[k]=source[i];
	}
	if(i<=m)
		for(;i<=m;i++)
			temp[k++]=source[i];
	else
		for(;j<=t;j++)
			temp[k++]=source[j];
	i=s;
	for(k=0;k<len;k++)
		source[i++]=temp[k];
}